package com.zyl.blog.common.domain.rbac.vo.role;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.zyl.blog.common.config.TreeConfig;
import com.zyl.blog.common.domain.rbac.bean.Role;
import lombok.Data;

import java.io.Serial;
import java.io.Serializable;
import java.math.BigInteger;
import java.time.LocalDateTime;
import java.util.Comparator;
import java.util.List;

/**
 * @version v1.0
 * @ProjectName: Personal_Blog_Server
 * @Package: com.zyl.blog.common.domain.rbac.vo.role
 * @ClassName: RoleVO
 * @Description: 角色VO
 * @Author FinalFantasy
 * @Date 2025/8/29-16:33
 */
@Data
public class RoleVO implements Serializable {

    @Serial
    private static final long serialVersionUID = 1L;

    public static final TreeConfig<RoleVO, BigInteger> TREE_CONFIG = TreeConfig.of(
            RoleVO::getRoleId,
            RoleVO::getParentId,
            RoleVO::getChildren,
            RoleVO::setChildren,
            Comparator.comparing(RoleVO::getRoleId)
    );

    /** 角色ID */
    @JsonProperty("roleId")
    private BigInteger roleId;

    /** 角色编码 */
    @JsonProperty("roleCode")
    private String roleCode;

    /** 角色名称 */
    @JsonProperty("roleName")
    private String roleName;

    /** 角色描述 */
    @JsonProperty("description")
    private String description;

    /** 角色状态 */
    @JsonProperty("status")
    private Integer status;

    /** 创建时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @JsonProperty(value = "createTime", access = JsonProperty.Access.READ_ONLY)
    private LocalDateTime createTime;

    /** 更新时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @JsonProperty(value = "updateTime", access = JsonProperty.Access.READ_ONLY)
    private LocalDateTime updateTime;

    /** 是否是系统字段（是则不可D操作） */
    @JsonProperty("isSystem")
    private Integer isSystem;

    /** 逻辑删除：0=正常，1=已删除 */
    @JsonIgnore
    @TableLogic
    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    private Integer deleted;

    /** 父角色ID */
    @JsonProperty("parentId")
    private BigInteger parentId;

    /** 子角色列表 */
    @JsonProperty("children")
    private List<RoleVO> children;

    /**
     * 将角色列表转换为视图对象列表
     *
     * @param roles 角色列表
     * @return {@link List }<{@link RoleVO }>
     */
    public static List<RoleVO> toVO(List<Role> roles) {
        return BeanUtil.copyToList(roles, RoleVO.class);
    }
}
